/*Version 1.0*/
#include <stdio.h>
#include <math.h>
#include "Dessiner.h"

void DessinerCarre(ClutterCairoTexture * Dessins,cairo_t * cr,Carre * car)
{
  /*Pour eviter de superposer les differents objets*/
  clutter_cairo_texture_clear (Dessins);

  /*On dessine ensuite le carre a l'aide de la structure carre*/
  /*1 On rempli le Carre avec la couleur de fond*/
  cairo_set_source_rgb(cr,car->fond.r,car->fond.g,car->fond.b);
  cairo_rectangle(cr,car->coordoCar.x,car->coordoCar.y,car->dim,car->dim);
  cairo_fill(cr);

  /*2 On s'occupe du contours*/
  cairo_set_line_width (cr,car->epaisseur_contour);
  cairo_set_line_cap(cr,CAIRO_LINE_CAP_SQUARE);
  cairo_set_source_rgb (cr,car->contour.r,car->contour.g,car->contour.b);
  cairo_rectangle(cr,car->coordoCar.x,car->coordoCar.y,car->dim,car->dim);
  cairo_stroke(cr);
}

void DessinerRectangle(ClutterCairoTexture * Dessins,cairo_t * cr,Rectangle * rec)
{	  
  
  /*Pour eviter de superposer les differents objets*/
  clutter_cairo_texture_clear (Dessins);
		
  /*On dessine ensuite le rectangle a l'aide de la structure rectangle*/
  /*1 On rempli le rectangle avec la couleur de fond*/
  cairo_set_source_rgb(cr,rec->fond.r,rec->fond.g,rec->fond.b);
  cairo_rectangle(cr,rec->coordoRec.x,rec->coordoRec.y,rec->dimX,rec->dimY);
  cairo_fill(cr);

  /*2 On s'occupe du contours*/
  cairo_set_line_width (cr,rec->epaisseur_contour);
  cairo_set_line_cap(cr,CAIRO_LINE_CAP_SQUARE);
  cairo_set_source_rgb (cr,rec->contour.r,rec->contour.g,rec->contour.b);
  cairo_rectangle(cr,rec->coordoRec.x,rec->coordoRec.y,rec->dimX,rec->dimY);
  cairo_stroke(cr);
}

void DessinerPlume(ClutterCairoTexture * Dessins,cairo_t * cr,Plume * p)
{
  int i;
  /*Pour eviter de superposer les differents objets*/
  clutter_cairo_texture_clear (Dessins);

  /*On dessine d'abord le contour*/
  cairo_move_to(cr,p->coorPl.x,p->coorPl.y);

  cairo_set_line_width (cr,p->epaisseur_contour);
  cairo_set_line_cap(cr,CAIRO_LINE_CAP_SQUARE);
  cairo_set_source_rgb (cr,p->contour.r,p->contour.g,p->contour.b);

  for(i=0;i<p->tab_coordonnees->len;i++)
  {
    cairo_rel_line_to(cr,g_array_index(p->tab_coordonnees,Coordonnees,i).x,
		   g_array_index(p->tab_coordonnees,Coordonnees,i).y);
  }
  cairo_close_path (cr);
  cairo_stroke(cr);

  /*On rempli ensuite la forme*/
  cairo_move_to (cr,p->coorPl.x,p->coorPl.y);

  for(i=0;i<p->tab_coordonnees->len;i++)
  {
    cairo_rel_line_to(cr,g_array_index(p->tab_coordonnees,Coordonnees,i).x,
		      g_array_index(p->tab_coordonnees,Coordonnees,i).y);
  }
  cairo_close_path (cr);

  cairo_set_source_rgb(cr,p->fond.r,p->fond.g,p->fond.b);
  cairo_fill(cr);
}

void DessinerCercle(ClutterCairoTexture * Dessins,cairo_t * cr,Cercle * cer)
{
  /*Pour eviter de superposer les differents objets*/
  clutter_cairo_texture_clear (Dessins);
	
  cairo_set_source_rgb (cr,cer->fond.r,cer->fond.g,cer->fond.b);
	
  cairo_arc (cr, cer->coordoCer.x, cer->coordoCer.y, cer->rayon, 0.0,2 * M_PI);
  cairo_fill(cr);
  
  /*2 On s'occupe du contours*/
  cairo_set_line_width(cr, cer->epaisseur_contour);
  cairo_set_line_cap(cr,CAIRO_LINE_CAP_SQUARE);	
  cairo_set_source_rgb (cr,cer->contour.r,cer->contour.g,cer->contour.b);
  cairo_arc(cr, cer->coordoCer.x, cer->coordoCer.y, cer->rayon, 0.0, 2 * M_PI);
	
  cairo_stroke (cr);
}

/*Precondition : carre modifié au prealable par le module carre
Postcondition : On renvoie un nouveau dessin en ecrasant ancien*/
void MettreAjourCarre(ClutterCairoTexture * Dessins,cairo_t * cr,Carre * car)
{
  DessinerCarre(Dessins,cr,car);
}

/*Precondition : cercle modifie au prealable par le module rectangle
Postcondition : On renvoie un nouveau dessin en ecrasant ancien*/
void MettreAjourRectangle(ClutterCairoTexture * Dessins,cairo_t * cr,Rectangle * rec)
{
  DessinerRectangle(Dessins,cr,rec);
}

/*Precondition : cercle modifie au prealable par le module cercle
Postcondition : On renvoie un nouveau dessin en ecrasant ancien*/
void MettreAjourCercle(ClutterCairoTexture * Dessins,cairo_t * cr,Cercle * cer)
{
  DessinerCercle(Dessins,cr,cer);
}

/*Precondition : plume modifiée au prealable par le module plume
Postcondition : On renvoie un nouveau dessin en ecrasant ancien*/
void MettreAjourPlume(ClutterCairoTexture * Dessins,cairo_t * cr,Plume * p)
{
  DessinerPlume(Dessins,cr,p);
}
